<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

<script>
// ES5 -> ECMAScript5
// ES5新增的内容：

// 严格模式：浏览器提供的另一种代码运行模式
// 严格模式的主要目的：
// 1.消除了一些不合理代码
// 2.未来将来的版本做铺垫

// 严格模式的一些限制：
// 1.变量必须使用var，否则报错
// 2.对不合理的操作显示报错，不再静默失败处理
// 3.禁止对象属性重名（IE）
// 4.禁止函数参数重名
// 5.禁止使用以0开头的八进制数（以0o开头）
// 6.禁止使用with语句
// 7.强制为eval函数创建作用域
// 8.arguments和形参互不影响
// 9.禁止函数中的this直接指向window对象
// 10.函数必须声明在全局或函数内部

// 数组扩展：
// indexOf()
// lastIndexOf()
// forEach()
// map()
// filter()
// some()
// every()
// reduce()
// Array.isArray()

// 字符串
// trim()

// 日期对象
// Date.now()

// 函数
// bind()
// call()
// apply()

// JSON
// JSON.parse()
// JSON.stringify()

// classList对象
// 每一个DOM元素都有一个classList属性
// classList对象主要用于操作元素的类名
// length 返回元素的类名个数
// value 返回元素的所有类名
// item() 返回指定索引位置的类名
// add() 添加类名
// remove() 删除类名
// contains() 判断类名
// toggle() 切换类名

// Object的静态方法：
// Object.defineProperty()用于定义对象的属性和描述符(定义单个属性)
// Object.defineProperties()用于定义对象的属性和描述符（定义多个属性）
// Object.keys()返回对象所有可枚举属性的数组
// Object.getOwnPropertyNames()返回对象自身所有属性的数组（包含不可枚举属性）
// Object.create()用于创建对象，并指定对象的原型和属性描述符
// Object.getPrototypeOf()获取对象的原型对象
// Object.getOwnPropertyDescriptor()获取对象自身属性的描述符


// ES6 -> ECMAScript2015 -> ES2015
// ES7 -> ECMAScript2016 -> ES2016
// ES8 -> ECMAScript2017 -> ES2017
// ...

// let关键字
// let用于声明变量，可以重新赋值

// const关键字
// const用于声明常量，不可以重新赋值
// 如果const声明的常量值为引用类型，属性的值可以修改

// let和const 与 var 的一些区别：
// 1.不允许重复声明
// 2.在全局声明不会添加到window对象中
// 3.会形成块级作用域 {代码块}
// 4.不能和函数的形参重名
// 5.没有声明提升（必须先声明后使用）

// 暂时性死区TDZ
// 在某个区块中，使用let或const声明的变量，会锁定/绑定当前区块，不受外部影响，这种情况为我们称为暂时性死区
// let x = 1;
// if (123) {// 暂时性死区TDZ
//     console.log( x );
//     let x = 2;
// }


// 模板字符串
// 模板字符串使用反引号表示 ``
// 1.模板字符串内部可以换行
// 2.模板字符串内部使用${}插入变量

</script>
</body>
</html>